package HomeWork.map;

import java.util.HashMap;
import java.util.Scanner;

/**
 * 第二题:
 * 分析以下需求,并用代码实现
 *
 * 1.定义一个超市的储物柜类（Locker），属性：柜子的容量（柜子的格数）、存储物品的集合；
 *
 * 2.储物柜最大容量为20；为储物柜对象提供存物和取物方法；
 *
 * 3.在测试类（LockerTest）中，通过键盘录入，模拟存物品和取物品的过程。
 *
 * 要求：(1)调用存放物品方法时，传入要存入的物品名称，判断储物柜是否有空余容量，有空余则提示存放物品成功，返回一个随机的四位数字的取货码。​ (2)调用取物方法时，传入取货码，打印出对应的物品名称，若无对应的物品则提示取货码不正确；
 *
 * 运行效果如下：
 *
 * 请存入货物（以over结束）：
 * 物品1
 * 存货成功，取货码为：8325
 * 物品2
 * 存货成功，取货码为：5676
 * 物品3
 * 存货成功，取货码为：8202
 * over
 * 请输入取货码（以over结束）：
 * 5676
 * 取货成功。请收好您的物品2
 * 1234
 * 没有该取货码，请检查。
 * over
 */
public class Supermarket {
    public static void main(String[] args) {
        saveAndTake();
    }

    private static void saveAndTake() {
        Locker locker = new Locker();
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入操作选项：1、存货 2、取货 3、输入over结束：");
            switch (sc.nextLine()){
                case "1" -> {
                    System.out.println("请输入要存储的货物：");
                    try {
                        System.out.println("存货成功，取货码为：" + locker.deposit(sc.nextLine()));
                    } catch (FullProductsException e) {
                        System.out.println(e.getMessage());
                    }
                }
                case "2" -> {
                    try {
                        System.out.println("请输入取货码：");
                        System.out.println("取货成功，请收好您的" + locker.takeOut(sc.nextLine()));
                    } catch (CodeNotFindException e){
                        System.out.println(e.getMessage());
                    }
                }
                case "over" -> {
                    return;
                }
                default -> System.out.println("您输入的选项有误");
            }
        }
    }
}

class Locker{
    private final int MAX_CAPACITY = 20;
    private final HashMap<java.lang.String, String> products;

    public Locker() {
        products = new HashMap<>();
    }

    public Locker(int capacity) {
        if (capacity >= MAX_CAPACITY){
            throw new IllegalArgumentException("传入的容量参数" + capacity + "有误,应小于" + MAX_CAPACITY);
        }
        products = new HashMap<>(capacity);
    }

    public String deposit(String product) {
        if (products.size() > MAX_CAPACITY){
            throw new FullProductsException("货物存满了！！");
        }
        java.lang.String takeCode;
        do {
            takeCode = getTakeCode();
        } while (products.containsKey(takeCode));
        products.put(takeCode, product);
        return takeCode;
    }

    public String takeOut(java.lang.String takeCode){
        if (!products.containsKey(takeCode)){
            throw new CodeNotFindException("取件码错误，请重试");
        }
        return products.remove(takeCode);
    }

    private java.lang.String getTakeCode(){
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            sb.append((int)(Math.random() * 10));
        }
        return sb.toString();
    }
}

class FullProductsException extends RuntimeException {
    public FullProductsException() {
    }

    public FullProductsException(String message) {
        super(message);
    }
}
class CodeNotFindException extends RuntimeException{
    public CodeNotFindException() {
    }

    public CodeNotFindException(String message) {
        super(message);
    }
}
